在Shader Graph中使用表面梯度框架合成法线贴图
近期,Unity Labs的新研究论文介绍了一种便于技术美术师和图形工程师理解及使用的法线贴图混合框架。
自从实时计算机图形设计中引入法线贴图以来,即使是经验丰富的图形工程师,在利用正确数学方法组合或混合法线贴图获得视觉上美观的效果一直是一个难题。过去,人们经常在世界空间中混合法线,这样获得的结果既不正确,也无法令人满意。
在《Surface Gradient Based Bump Mapping Framework》(基于表面梯度的凹凸贴图框架)中,Unity Labs团队介绍了一种可以解决传统法线贴图局限性的新框架。新的方法虽然结合了不同形式的凹凸贴图,但使用起来依旧简单直观,对技术美术师和图形工程师十分友好。
阅读Unity Labs新论文《Surface Gradient Based Bump Mapping Framework》:
https://unity.com/labs/publications
在现代计算机图形设计中,材质分层是实现丰富而复杂的环境的关键。为此,我们需要支持在多个纹理坐标集上制作凹凸贴图,并能够混合多个凹凸贴图。此外,我们希望能够在对象空间的法线贴图上调整凹凸大小,并且把这些贴图与切线空间法线贴图及三平面投影正确地进行合成或混合。
传统上,实时图形仅在单个纹理坐标集上支持凹凸贴图。凹凸贴图需要每个顶点的数据才能进行预计算,并存储在切线空间。支持额外的纹理坐标集需要根据顶点按比例增加额外的存储量。这种方法既不支持程序化几何体或纹理的坐标,也不支持高级的几何体变形过程。
高清晰渲染管线HDRP可以利用基于表面梯度的凹凸贴图框架,来解决这个问题。在HDRP中,传统的顶点切线空间会被用作第一个纹理坐标集,从而符合严格的MikkTSpace标准。较复杂的情况需要使用这种方法来处理,例如:用于低多边形硬表面几何体的烘焙法线贴图。
对于所有后续的纹理坐标集,我们可以在像素着色器上即时计算切线空间。这种方法使得我们可以在所有纹理坐标集上支持法线贴图,并且可以结合程序化几何体和高级变形过程进行使用,而不是只可以进行简单的蒙皮。
根据Unity Labs论文介绍:通过积累表面梯度可以实现正确的混合。
过去,该框架仅适用于面向HDRP构建的着色器。现在,我们在GitHub上提供了面向Shader Graph着色器视图的框架原型版本,并使用Unity 2019.3.0b4和Shader Graph 7.1.2版本构建了相应的示例场景。该框架本身完全通过Shader Graph的子视图来实现,而且每个子视图都只使用了内置节点来制作。
下载示例场景:
https://github.com/mmikk/Surfgrad-Framework-Unity-Shadergraph
该方法包含以下步骤:
为每个凹凸贴图创建一个表面梯度。
通过用户定义的凹凸大小,调整每个表面梯度。
将所有表面梯度添加或混合为一个梯度。
进行解析运算,产生最终的凹凸贴图法线。
通过使用该框架,每种凹凸贴图形式都会产生一个表面梯度,便于统一进行处理。这些贴图形式包括:切线/对象空间法线贴图、平面投影、三平面投影、以及程序化3D纹理形式的凹凸贴图。使用这种方法能够方便我们正确地混合贴图。
示例中提供了多个使用该框架的着色器视图,每个视图展示了该框架的不同使用案例。本文我们将简单介绍这些案例。
温馨提示:本文中所有着色器视图可点击查看大图。
基本法线贴图
Basic着色器视图介绍了整个流程,并展示了使用顶点切线空间和程序化切线空间之间的区别。
BasisMikkTS.shadersubgraph子视图会产生常规的切线和二重切线,该视图仅适用于UV0。
GenBasisTB.shadersubgraph子视图可以使用任何纹理坐标,获取程序化切线和二重切线。
该示例中使用了UV0,我们会在Blackboard面板上,使用一个布尔值属性作为开关。对于其它UV集,该着色器必须使用第二种方法。
请注意,我们有一个特殊的Tex ts norm to deriv.shadersubgraph子视图,该视图用于采样切线空间法线贴图。它会返回名称为derivative的vector2数值,而不是vector3数值。
在使用相同的UV集进行采样时,我们可以添加或混合这些衍生数值。然而,我们需要在添加或混合表面梯度后,才能够使用不同UV集或不同凹凸贴图形式进行添加和混合。
为了产生表面梯度,我们可以使用上图中的Surfgrad TBN.shadersubgraph子视图。
为了调整表面梯度上的凹凸大小,我们可以使用简单的Multiply节点。或者,我们也可以使用Apply Bump Scale.shadersubgraph子视图。
之后,我们可以利用Resolve Surfgrad.shadersubgraph子视图将表面梯度转换为最终的凹凸贴图法线。
对象空间法线贴图
我们也将对象空间法线贴图集成到表面梯度工作流程中。因此,我们可以调整凹凸贴图的强度,将对象空间法线贴图混合或添加到其它形式的凹凸贴图。
下面是名为OS nmap basic视图。
首先,我们将已采样的法线从对象空间转换到世界空间。为了实现最佳效果,转换过程会以法线的形式进行变换。由于Shader Graph着色器视图内置的转换程序不支持该方法,我们最好在Transform节点中把Type设为Direction。
然后,使用Normal to surfgrad.shadersubgraph子视图将法线转换为表面梯度。当凹凸贴图的影响来源变成表面梯度时,我们便可以像处理其它形式的凹凸贴图一样处理它,我们可以使用上文提到的方法调整凹凸大小,添加或混合多个表面梯度,直到最后完成解析并得到最终的法线。
三平面投影
三平面投影主要用于凹凸贴图作为3D纹理的特殊情况。Unity Labs的论文介绍了正确处理过程的完整运算步骤。
下图是常规法线贴图混合方法(左图)和使用表面梯度方法(右图)之间的不同之处。
Triplanar视图会使用Triplanar to surfgrad.shadersubgraph子视图执行混合操作,使用三平面投影结果来产生表面梯度。相同的,我们可以使用凹凸大小修改表面梯度,将表面梯度混合或添加到其它表面梯度上,然后完成制作最终法线。
混合及添加多个凹凸贴图
新框架的一个优点是:它可以利用任意数量的纹理坐标集,包括程序化UV,来正确混合任何类型或数量的凹凸贴图。
下面的示例展示了三种不同凹凸贴图的混合效果,分别是:可平铺的切线空间法线贴图、对象空间法线贴图、以及作为程序化3D纹理的凹凸贴图。
如下图所示,Mixing视图通过这种方法执行混合过程。请注意,每个凹凸贴图如何产生受到强度影响的表面梯度,以及如何通过添加或混合操作来组合表面梯度。最后,经过组合的表面梯度会产生最终的法线。
更多示例
该Unity示例场景还有几个其它的示例,例如:应用到法线贴图表面的三平面投影,经过视差矫正或视差遮蔽贴图POM处理后的细节法线贴图,来自高度图的凹凸贴图,以及使用程序化3D纹理的凹凸贴图等。
有待解决的问题
新框架只使用Shader Graph着色器视图中子视图的内置节点来实现,这体现了Shader Graph着色器视图的强大和灵活性。
但是,该框架不完全符合针对UV0的MikkTSpace标准,我们还要解决以下问题:
Shader Graph着色器视图目前无法访问加入插值后的非标准化切线、二重切线和法线,如果要完全符合MikkTSpace标准,我们需要实现这一点。
Shader Graph着色器视图需要在UV0的切线空间上导出最终的凹凸法线。由于我们在Shader Graph着色器视图中并没有使用符合标准的转换方法,因此这里可能会出现问题。
由于Shader Graph着色器视图需要在UV0切线空间,向主节点传入凹凸法线,因此在使用对象空间法线贴图或三平面法线贴图时,也会出现问题。未来针对这个问题的解决方案是:添加在世界空间将法线传入到主节点的支持。
需要特别说明:HDRP内置着色器完全符合MikkTSpace标准,不会出现这个问题。
Unity 2019.3中的新功能
在Unity 2019.3中,我们可以在Shader Graph着色器视图,通过可视化的方式制作着色器,并使用这些着色器在Visual Effect Graph中创造自定义外观和渲染行为。
我们还添加了Shader Keywords着色器关键词,可以在视图中创建静态分支,该功能可以帮助用户创建着色器LOD系统。
Unity 2019.3也添加了面向数据技术栈DOTS动画的顶点蒙皮支持,帮助用户制作更好的水体和枝叶效果。
此外,Shader Graph着色器视图的便签功能可以改善工作流程,让开发者可以给项目参与者留下注释和解释信息。
最后,程序化图案子视图示例展示了如何应用数学来创建程序化形状和图案。
小结
在Shader Graph中使用表面梯度框架合成法线贴为大家介绍到这里,如果你有任何意见和反馈,请在Shader Graph论坛向我们提供反馈:
https://forum.unity.com/forums/shader-graph.346/
下载Unity Connect APP,请点击此处。 观看更多Unity官方精彩视频,请关注“Unity官方”B站账户。
你可以访问Unity答疑专区留下你的问题,Unity社区和官方团队帮你解答:
Connect.unity.com/g/discussion
推荐阅读
丰田和Applied Intuition运用Unity进行自动驾驶中的程序化生成
官方活动
「Unity X 创想家计划」是针对中国地区9-15岁青少年的编程教育计划,火热报名中~~[了解详情...]
11月25日-12月2日,Asset Store最受欢迎的资源将进行5折大促,每日一款特惠插件3折优惠。[了解详情...]
点击“阅读原文”下载示例项目
↓↓↓